/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'use strict';

const Encoding = (type, value) => class {
  static get type() {
    return type;
  }
  static get value() {
    return value;
  }
};

export class Primitive extends Encoding('primitive', 0x00) {}
// exports.Primitive = Primitive;
export class Constructed extends Encoding('constructed', 0x20) {}
// exports.Constructed = Constructed;
const Encodings = [Primitive, Constructed];

export function findEncoding(value) {
  const valueType = typeof value;
  switch (valueType) {
    case 'string':
      return Encodings.find(encoding => encoding.type === value);
    case 'number':
      return Encodings.find(encoding => encoding.value === value);
    default:
      throw new Error(`Must use string or number to lookup encoding, not "${valueType}"`);
  }
}

export let _encodings = {
  Primitive,
  Constructed,
  findEncoding
}
